Java EE(Java Platform,Enterprise Edition)是
sun公司(2009年4月20日
甲骨文将其收购)推出的企业级
应用程序版本。这个版本以前称为 J2EE。能够帮助我们开发和部署可移植、健壮、可伸缩且安全的
服务器端 Java应用程序。Java EE 是在 Java SE 的基础上构建的,它提供Web 服务、
组件模型、管理和通信
API,可以用来实现企业级的
面向服务体系结构(service-oriented architecture,
SOA)和 Web 3.0应用程序。
主要技术
JDBC(Java Database Connectivity)提供连接各种
关系数据库的统一接口,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的
API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,同时,JDBC也是个商标名。
EJB(
Enterprise JavaBeans)使得开发者方便地创建、部署和管理
跨平台的基于组件的
企业应用。
Java RMI(Java Remote Method Invocation)用来开发分布式Java应用程序。一个Java对象的方法能被远程Java
虚拟机调用。这样,
远程方法调用可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用程序都是用Java写的。
JNDI(Java Naming and Directory Interface)提供从
Java平台到的统一的无缝的连接。这个接口屏蔽了
企业网络所使用的各种命名和
目录服务。
JMAPI(Java Management API)为
异构网络上系统、网络和
服务管理的开发提供一整套丰富的对象和方法。
JMS(Java Message Service)提供企业消息服务,如可靠的
消息队列、发布和订阅通信、以及有关推拉(Push/Pull)技术的各个方面。
JTS(Java
transaction Service)提供存取
事务处理资源的
开放标准,这些事务处理资源包括事务处理应用程序、事务处理管理及监控。
JMF(Java Media Framework API),它可以帮助开发者把音频、视频和其他一些基于时间的媒体放到Java应用程序或applet
小程序中去,为多媒体开发者提供了捕捉、回放、编解码等工具,是一个弹性的、跨平台的多媒体解决方案。
Annotation(Java Annotation),在已经发布的JDK1.5(tiger)中增加新的特色叫 Annotation。Annotation提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和
元数据联系起来。这样
编译器可以将元数据存储在Class文件中。这样
虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。
JavaBeans,它是一个开放的标准的组件
体系结构,它独立于平台,但使用Java语言。一个JavaBean是一个满足
JavaBeans规范的Java类,通常定义了一个现实世界的事物或概念。一个JavaBean的主要特征包括属性、方法和事件。通常,在一个支持JavaBeans规范的
开发环境(如Sun Java Studio 和
IBM VisualAge for Java)中,可以可视地操作JavaBean,也可以使用JavaBean构造出新的JavaBean。JavaBean的优势还在于Java带来的
可移植性。EJB (Enterprise JavaBeans) 将JavaBean概念扩展到Java
服务端组件
体系结构,这个模型支持多层的
分布式对象应用。除了JavaBeans,典型的
组件体系结构还有
DCOM和
CORBA。
javaFX,Sun刚刚发布了
JavaFX技术的
正式版,它使您能利用 JavaFX
编程语言开发富互联网应用程序(
RIA)。JavaFX Script编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative, staticallytyped(声明性的、静态类型)
脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为 JavaFXScript是静态类型,它同样具有结构化代码、重用性和封装性,如包、类、继承和单独编译和发布单元,这些特性使得使用Java技术创建和管理大型程序变为可能。
JMX(Java Management Extensions,即
Java管理扩展)是一个为应用程序、设备、系统等植入。
管理功能的框架。JMX可以跨越一系列异构操作系统平台、
系统体系结构和
网络传输协议,灵活的开发
无缝集成的系统、网络和服务管理应用。
JPA (Java Persistence API),JPA通过
JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体
对象持久化到数据库中。
核心特征
Bean Validation是Java EE 6
数据验证新框架,Validation API并不依赖特定的应用层或是编程模型,这样同一套验证可由应用的所有层共享。它还提供了通过扩展Validation API来增加客户化验证约束的机制以及查询约束元数据仓库的手段。
在Java EE 6的Bean Validation出现之前,开发者不得不在
表示层框架、
业务层以及
持久层中编写验证规则以保证这些规则的
同步性,但这么做非常浪费时间而且极易出错。Bean Validation是通过约束实现的,这些约束以注解的形式出现,注解可以放在JavaBean(如backing bean)的属性、方法或是类上面。约束既可以是内建的注解(位于javax.validation.constraints包下面),也可以由用户定义。一些常用的内建注解列举如下:
◆Min:被@Min所注解的元素必须是个数字,其值要大于或等于给定的
最小值。
◆Max:被@Max所注解的元素必须是个数字,其值要小于或等于给定的
最大值。
◆Size:@Size表示被注解的元素必须位于给定的最小值和最大值之间。支持Size验证的
数据类型有String、Collection(计算集合的大小)、Map以及数组。
◆NotNull:@NotNull确保被注解的元素不能为null。
◆Null:@Null确保被注解的元素一定为null。
◆Pattern:@Pattern确保被注解的元素(String)一定会匹配给定的Java
正则表达式。
代码中通过Bean Validation注解声明了一些约束:
public class Address {
@NotNull @Size(max=30)
private String addressline1;
@Size(max=30)
private String addressline2;
public String getAddressline1() {
return addressline1;
}
public void setAddressline1(String addressline1) {
this.addressline1 = addressline1;
}
}
@NotNull指定被注解的元素addressline1不能为null;@Size指定被注解的元素addressline1和addressline2不能超过给定的最大值,即30个字符。
在验证Address对象时,addressline1的值被传递到针对@NotNull约束的验证类以及针对@Size约束的验证类中,而addressline2的值被传递到针对@Size约束的验证类中,由相关的验证类进行验证。如下代码自定义了一个名为ZipCode的约束:
@Size(min=5, max=5)
@ConstraintValidator(ZipcodeValidator.class)
@Documented @Target({ANNOTATION_TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface ZipCode {
String[] groups() default {};
}
可以将@ZipCode用在类、属性或是方法上,就像其他约束一样。
public class Address {
@ZipCode
private String zipCode;
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
Validation API
开发者可以借助于Validation API以编程的方式验证JavaBean。Bean Validation API的默认包是javax.validation。下面对该包中的一些类进行说明:
ConstraintValidator:这是一个接口,具体的约束验证类需要实现该接口。该接口定义了相关的逻辑以验证给定
对象类型中的约束。
Validator:Valida接口持有对象验证图的契约。该接口的实现必须是
线程安全的。
ConstraintViolation:ConstraintViolation接口表示给定bean上的约束验证失败,它公开了约束违背
上下文以及描述该违背情况的信息。
ValidationException:如果在验证过程中出现了某些不可恢复的错误就会抛出ValidationException异常。某些情况下可以指定该异常,如不合法的分组(group)定义、不合法的约束定义以及不合法的约束声明等等。
约束元数据请求API
Bean Validation规范提供了查询约束仓库的手段。该API主要用于工具支持和与其他框架、库以及JSR的集成。Bean Validation规范旨在为对象约束提供一个验证引擎和元数据仓库。需要进行约束定义、验证和元数据的框架(Java EE或Java SE)可以利用Bean Validation规范完成这些功能,从应用或是基础设施的角度来看,这么做可以避免不必要的重复工作。
Bean Validation已经集成到了JSF 2.0和JPA 2.0中。在JSF中可以将表单输入域与
域对象的属性绑定起来。JSF 2和Bean Validation可以判断出绑定的是哪个属性并执行与之相关的验证,还会将约束违背的
信息显示给用户。Hibernate Validator 4是Bean Validation规范的参考实现框架,其最新版增加了不少新特性,如分组验证、与JPA 2和JSF 2的自然集成以及扩展的注解集等等。
核心优势
J2EE容易让初学者误解是独立于一套Java的
技术方案。
从更深层次来看,Java诞生十年,多年前的
业务组件还可以使用,软件应用不再由于语言的更迭革命带来毁灭的打击了。
功能规定
架构图
让我们看看
Java EE 5有哪些新的功能或规定,我们可以从
SUN网站下载Java EE 5规范。其架构图:
JAVA EE 架构图灰色加黑部分是
Java EE 5新的功能,我们看到,在WEB层主要加入了JSF这个新的表现层框架,和我们日常开发关系密切的是,引入了新的Java Persistence标准,这个标准正在由
EJB 3.0专家组制定。
值得指出的是,这个Java持久化标准也可以嵌入在WEB层调用,所以,它肯定不会从属于EJB标准,这样,当前所有的Java
持久层标准如:JDBC/JDO/Hibernate/Entity Bean将可能统一,减少用户的架构选择 痛苦。
折叠EJB3.0和EJB2.0的区别
从架构图可以看出,无论Web结构或EJB结构,提供实现的功能相差不多,这样,我们的业务核心组件就可以根据需要部署在Web或EJB中运行,而不依赖具体的Java EE容器了。前面一章图的目标在Java EE 5中可以实现了。
当然,Java EE 5重要改变还是:Java EE不再象以前那样只注重大型商业系统的开发,而是更关注小到中型系统的开发,简化这部分
系统开发步骤。
落实这一简化行动的最大特征是在Java 5.0(Java 1.5)中加入Annotations,通过Annotations引入,降低Java EE开发时,既要写code,又要写XML
配置文件之苦,来回照顾,疲于奔命,Annotations既是得益于
C++语言,也是从
开源项目xDoclet实践中获得经验。
但是Annotations是一把
双刃剑,初学者用得不好,将会使得原本在XML中的Hard code(
硬编码) 写进入代码Annotations,破坏代码的简洁和灵活性,
当然,Annotations的引入不只是解决XML配置,从大的概念说,是解决一个资源注射问题(XML属于其中一个资源),在原理J2EE中,容器管理的资源都是由
JNDI向
应用程序提供的,通过Annotations可以方便实现注射。
资源注射(Resource injection)设计概念其实是来自Ioc模式(Dependency
Injection ),笔者设计开发的Jdon框架其实已经将Annotations这一宗旨的目的实现,在Jdon框架应用演示源码SimpleJdonFrameworkTest中,在jdonframework.xml中有一段如下配置:
这段配置是将数据库的JNDI名java:/TestDS注射到Jdbc
DAO中。
Jdon Framework下一个版本将是基于Java 5.0,这行配置 将可通过 Annotations写在
jdbcDAO代码中,方便程序员开发。
从这里,大家也可以知道EJB 3.0和EJB 2.0的区别了,有的人疑惑,是学习EJB 3.0还是学习EJB 2.0,其实EJB 3.0并没有在原理机制上对EJB有多大改动,只是做了编程方面的简化,另外EJB CMP参考了
Hibernate新特点,EJB 3.0最大简化变动是CMP编程方法上。所以,无论学习EJb 3.0/2.0,EJB原理和
运行机制都是一样,这部分才是学习EJB最大的困难处,而不是因为到了EJB 3.0,理解EJB就会容易。
初学者可从Eclipse+Xdoclet开发EJB 2.0开始学习, EJB 3.0 = EJB 2.0 + xDoclet,这里有一篇Eclipse开发EJB教程,使用JBossIDE非常简单,无需Lomboz等插件。
Security安全
Security安全是Java EE的一个重要特点,也就是基于容器的安全访问,无需自己手工编码,具体实现可参考Jdon框架应用演示源码JdonNews。这虽然是基于J2EE 1.3编写,但是和Java EE 5区别不是很大。
事务管理Transaction Management也是Java EE 5的一个重要部分,该标准文档从几个方面阐述了事务管理的要点,标准中规定了在WEB层中使用事务和线程的处理关系,标准中规定:Web服务器如Tomcat无需在Web层提供事务支持,因为
Web组件根本不支持事务繁衍/传递。
因为当前一些架构如 Struts+Spring+Hibernate/Struts+Hibernate是标准中的Web结构,因此Java EE 5在J2EE 4.2.2规定了 Web组件事务的
生命周期,如果Web组件直接调用JTA,事务就不可以跨一个客户端的多个请求,事务只能在一个请求(Servlet/Jsp)中完成,这个标准规定了我们在Web架构中(如上述架构)无法使用
长事务(如
工作流/状态图跨页面请求事务),针对一个客户端跨请求的事务暂时只有唯一解决方案:只有使用EJB的有态Session。
以上是Java EE 5主要部分,Java EE包含更多其他技术部分如Jdbc
JMS JCA JNDI 等等,需要用户在实践中摸索。